{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "nitlJc0oWNTE"
   },
   "source": [
    "# Генерация фамилий по национальностям с помощью рекуррентной сети на основе ячеек GRU\n",
    "\n",
    "В данной работе будет создана модель, генерирующая фамилию человека в зависимости от выбранной национальности.\n",
    "Для выполнения данной работы загрузим список фамилий в привязке к национальности с одного из веб-порталов с помощью парсинга.\n",
    "Модель будет построена с помощью PyTorch и PyTorch Lighting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "uMcc7MzjWN9z"
   },
   "outputs": [],
   "source": [
    "#!pip install beautifulsoup4 pytorch-lightning optuna"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "csYBKqJ9HIZO"
   },
   "outputs": [],
   "source": [
    "from argparse import Namespace\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import random\n",
    "\n",
    "from bs4 import BeautifulSoup\n",
    "\n",
    "import torch\n",
    "from torch import nn, optim\n",
    "import torch.nn.functional as F\n",
    "from torch.utils.data import DataLoader, Dataset\n",
    "from torchvision import transforms as T\n",
    "import pytorch_lightning as pl\n",
    "from pytorch_lightning import LightningModule, LightningDataModule\n",
    "from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint\n",
    "import requests\n",
    "import re\n",
    "from time import sleep\n",
    "from tqdm.notebook import tqdm\n",
    "from sklearn.model_selection import train_test_split\n",
    "import matplotlib.pyplot as plt\n",
    "from IPython import display\n",
    "import optuna\n",
    "from optuna.integration import PyTorchLightningPruningCallback\n",
    "\n",
    "SEED = 2021"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "NhHilASgm61u"
   },
   "outputs": [],
   "source": [
    "def set_seed(seed=None, seed_torch=True):\n",
    "    if seed is None:\n",
    "        seed = np.random.choice(2 ** 32)\n",
    "    random.seed(seed)\n",
    "    np.random.seed(seed)\n",
    "    if seed_torch:\n",
    "        torch.manual_seed(seed)\n",
    "        torch.cuda.manual_seed_all(seed)\n",
    "        torch.cuda.manual_seed(seed)\n",
    "        torch.backends.cudnn.benchmark = False\n",
    "        torch.backends.cudnn.deterministic = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "q8FJl30-m-mL"
   },
   "outputs": [],
   "source": [
    "set_seed(seed=SEED)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "xxIISM4tOJZe"
   },
   "source": [
    "## 1. Cбор данных для модели\n",
    "\n",
    "Спарсим фамилии с национальностями с сайта https://imena-znachenie.ru, создадим датафрейм и сохраним его в файл."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "pcLjFUz0coLb"
   },
   "outputs": [],
   "source": [
    "# Аргументы для генерации датафрейма\n",
    "dataframe_args = Namespace(\n",
    "    # Путь к файлу с фамилиями для сохранения исходного датафрейма\n",
    "    raw_dataset_csv=f\"surnames.csv\",\n",
    "    # Размер части для обучения\n",
    "    train_proportion=0.7,\n",
    "    # Размер части для валидации\n",
    "    val_proportion=0.15,\n",
    "    # Размер части для теста\n",
    "    test_proportion=0.15,\n",
    "    # Путь к файлу с фамилиями с данными разбиения на обучение, валидацию и тест\n",
    "    output_munged_csv=f\"surnames_with_splits.csv\",\n",
    "    seed=2021\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "F1lSKxdWH0TN"
   },
   "outputs": [],
   "source": [
    "def get_national_surnames():\n",
    "    \"\"\" Создание списка фамилий по национальностям\n",
    "    с сайта https://imena-znachenie.ru\n",
    "\n",
    "    Результат\n",
    "    ---------\n",
    "    surnames : pandas dataframe\n",
    "      Датафрейм с фамилиями по национальностям.\n",
    "      Содержит колонки surname и nationality\n",
    "    \"\"\"\n",
    "\n",
    "    data = []\n",
    "\n",
    "    for index in tqdm(range(1, 429)):\n",
    "\n",
    "        url = f\"https://imena-znachenie.ru/familii/?PAGEN_1={index}\"\n",
    "        response = requests.get(url)\n",
    "        soup = BeautifulSoup(response.text)\n",
    "        for name_object in soup.find_all(\"p\", attrs=\"news-item\"):\n",
    "            name = name_object.findChild(\"a\").text.lower().strip()\n",
    "            nationality = name_object.findChild(\"img\", title=re.compile(r\"фамилии\")).get(\"title\").strip().lower()\n",
    "            nationality = nationality.split(\" \")[0]\n",
    "            data.append([name, nationality])\n",
    "        sleep(1)\n",
    "\n",
    "    surnames = pd.DataFrame(data, columns=[\"surname\", \"nationality\"])\n",
    "    surnames.drop_duplicates(\"surname\", inplace=True)\n",
    "\n",
    "    return surnames"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "RojuP_iyLrgl"
   },
   "outputs": [],
   "source": [
    "# Запуск парсинга и получение базового датафрейма с фамилиями\n",
    "df_surnames = get_national_surnames()\n",
    "\n",
    "# Сохраняем базовый датафрейм в файл\n",
    "df_surnames.to_csv(dataframe_args.raw_dataset_csv, index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 359
    },
    "id": "TOOAakxASZBq",
    "outputId": "1c7b263a-3afb-46fe-9f73-a141c046580d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>surname</th>\n",
       "      <th>nationality</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>аарон</td>\n",
       "      <td>еврейские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ааронов</td>\n",
       "      <td>еврейские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ааронова</td>\n",
       "      <td>еврейские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>абагян</td>\n",
       "      <td>армянские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>абаджян</td>\n",
       "      <td>армянские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>абае</td>\n",
       "      <td>еврейские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>абаев</td>\n",
       "      <td>еврейские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>абаева</td>\n",
       "      <td>еврейские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>абазян</td>\n",
       "      <td>армянские</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>абаимов</td>\n",
       "      <td>русские</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    surname nationality\n",
       "0     аарон   еврейские\n",
       "1   ааронов   еврейские\n",
       "2  ааронова   еврейские\n",
       "3    абагян   армянские\n",
       "4   абаджян   армянские\n",
       "5      абае   еврейские\n",
       "6     абаев   еврейские\n",
       "7    абаева   еврейские\n",
       "8    абазян   армянские\n",
       "9   абаимов     русские"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_surnames = pd.read_csv(dataframe_args.raw_dataset_csv)\n",
    "df_surnames[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fudwVLzRf7a0"
   },
   "source": [
    "### 1.2 Предобработка данных\n",
    "\n",
    "Проверим статистику фамилий по национальностям"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 328
    },
    "id": "ZEQBeAw3gAjh",
    "outputId": "f67f157b-95a4-413b-b0f1-10823febd490"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>surname</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nationality</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>английские</th>\n",
       "      <td>210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>армянские</th>\n",
       "      <td>871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>еврейские</th>\n",
       "      <td>11709</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>литовские</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>немецкие</th>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>осетинские</th>\n",
       "      <td>1081</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>русские</th>\n",
       "      <td>26673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>японские</th>\n",
       "      <td>201</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             surname\n",
       "nationality         \n",
       "английские       210\n",
       "армянские        871\n",
       "еврейские      11709\n",
       "литовские          1\n",
       "немецкие          25\n",
       "осетинские      1081\n",
       "русские        26673\n",
       "японские         201"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_surnames.groupby(\"nationality\").count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "nsV1a11tgC-B"
   },
   "source": [
    "Удалим литовские и немецкие фамилии, так как их очень мало"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 266
    },
    "id": "4URSuOb_gInl",
    "outputId": "0b30ea31-a5ef-4f74-9567-51a135b57027"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>surname</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nationality</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>английские</th>\n",
       "      <td>210</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>армянские</th>\n",
       "      <td>871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>еврейские</th>\n",
       "      <td>11709</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>осетинские</th>\n",
       "      <td>1081</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>русские</th>\n",
       "      <td>26673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>японские</th>\n",
       "      <td>201</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             surname\n",
       "nationality         \n",
       "английские       210\n",
       "армянские        871\n",
       "еврейские      11709\n",
       "осетинские      1081\n",
       "русские        26673\n",
       "японские         201"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_surnames = df_surnames[~df_surnames.nationality.isin([\"немецкие\", \"литовские\"])].copy()\n",
    "df_surnames.index = np.arange(len(df_surnames))\n",
    "df_surnames.groupby(\"nationality\").count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "a-TX1hMzgxbR"
   },
   "source": [
    "Разделим датасет на обучающую, валидационную и тестовую части с помощью стратифицированной выборки функции train_test_split из библиотеки sklearn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "7ldlXma9g8se"
   },
   "outputs": [],
   "source": [
    "X_train, X_test = train_test_split(df_surnames, test_size=dataframe_args.test_proportion,\n",
    "                                   stratify=df_surnames.nationality, random_state=dataframe_args.seed)\n",
    "X_train, X_val = train_test_split(X_train, test_size=dataframe_args.val_proportion,\n",
    "                                   stratify=X_train.nationality, random_state=dataframe_args.seed)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VeyFCoR7iH-6"
   },
   "source": [
    "Статистика распределения фамилий по национальности для обучающей выборки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 266
    },
    "id": "CSneYnofhiI9",
    "outputId": "0ae578e7-6f71-4e7d-b358-be0067194dc3"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>surname</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nationality</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>английские</th>\n",
       "      <td>151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>армянские</th>\n",
       "      <td>629</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>еврейские</th>\n",
       "      <td>8460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>осетинские</th>\n",
       "      <td>781</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>русские</th>\n",
       "      <td>19271</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>японские</th>\n",
       "      <td>146</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             surname\n",
       "nationality         \n",
       "английские       151\n",
       "армянские        629\n",
       "еврейские       8460\n",
       "осетинские       781\n",
       "русские        19271\n",
       "японские         146"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.groupby(\"nationality\").count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "dNcOArjziOos"
   },
   "source": [
    "Статистика распределения фамилий по национальности для валидационной выборки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 266
    },
    "id": "5UmjwtAdiA0M",
    "outputId": "ae58476f-1265-45af-e387-466c8eaca525"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>surname</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nationality</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>английские</th>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>армянские</th>\n",
       "      <td>111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>еврейские</th>\n",
       "      <td>1493</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>осетинские</th>\n",
       "      <td>138</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>русские</th>\n",
       "      <td>3401</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>японские</th>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             surname\n",
       "nationality         \n",
       "английские        27\n",
       "армянские        111\n",
       "еврейские       1493\n",
       "осетинские       138\n",
       "русские         3401\n",
       "японские          25"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_val.groupby(\"nationality\").count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "h5t4L_lxiQ0W"
   },
   "source": [
    "Статистика распределения фамилий по национальности для тестовой выборки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 266
    },
    "id": "_vqKuYk1iBGD",
    "outputId": "8aad7a90-4fd4-4e4f-fb30-9a6ec2bb65a8"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>surname</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nationality</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>английские</th>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>армянские</th>\n",
       "      <td>131</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>еврейские</th>\n",
       "      <td>1756</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>осетинские</th>\n",
       "      <td>162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>русские</th>\n",
       "      <td>4001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>японские</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             surname\n",
       "nationality         \n",
       "английские        32\n",
       "армянские        131\n",
       "еврейские       1756\n",
       "осетинские       162\n",
       "русские         4001\n",
       "японские          30"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_test.groupby(\"nationality\").count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4wd-V4n1jImx"
   },
   "source": [
    "Дополним исходный датасет столбцом с именем split, где будет находится тип разделения для каждой фамилии и сохраним данные в файл"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "HwNxXYt4ih2e"
   },
   "outputs": [],
   "source": [
    "df_surnames[\"split\"] = None\n",
    "split_index = np.where(df_surnames.columns == \"split\")[0][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "hJeJYaaliUgt"
   },
   "outputs": [],
   "source": [
    "df_surnames.iloc[X_test.index, split_index] = \"test\"\n",
    "df_surnames.iloc[X_val.index, split_index] = \"val\"\n",
    "df_surnames.iloc[X_train.index, split_index] = \"train\"\n",
    "\n",
    "assert all(~df_surnames.split.isna()) == True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "id": "ZZdWZoPzje5s"
   },
   "outputs": [],
   "source": [
    "df_surnames.to_csv(dataframe_args.output_munged_csv, index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QsQ2dbD2OtYw"
   },
   "source": [
    "## 2. Подготовка данных для работы модели\n",
    "\n",
    "### 2.1 Вспомогательный класс Vocabulary\n",
    "\n",
    "Базовый класс, который отвечает за кодирование слов и символов. Содержит базу (словарь) соответствия слов числовым индексам. Позволяет добавить новые слова и символы в базу."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "gExfXuFANwNf"
   },
   "outputs": [],
   "source": [
    "class Vocabulary:\n",
    "    \"\"\" Класс для кодирования слов и символов\n",
    "\n",
    "    Параметры\n",
    "    ---------\n",
    "    token_to_idx : dict\n",
    "      Словарь в формате {токен: индекс токена}\n",
    "      По умолчанию None, будет создан чистый словарь.\n",
    "    \"\"\"\n",
    "    def __init__(self, token_to_idx=None):\n",
    "\n",
    "        if token_to_idx is None:\n",
    "            token_to_idx = {}\n",
    "\n",
    "        self.token_to_idx = token_to_idx\n",
    "        self.idx_to_token = {i: k for k, i in token_to_idx.items()}\n",
    "\n",
    "    def add_token(self, token):\n",
    "        \"\"\" Добавление токена в словарь объекта\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        token : str\n",
    "          Токен для добавления в словарь\n",
    "\n",
    "        Результат \n",
    "        ---------\n",
    "        index : int\n",
    "          Индекс токена в словаре\n",
    "        \"\"\"\n",
    "        if token in self.token_to_idx:\n",
    "            index = self.token_to_idx[token]\n",
    "        else:\n",
    "            index = len(self)\n",
    "            self.token_to_idx[token] = index\n",
    "            self.idx_to_token[index] = token\n",
    "        return index\n",
    "\n",
    "    def lookup_token(self, token):\n",
    "        \"\"\" Поиск индекса для токена в словаре \n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        token : str\n",
    "          Токен для поиска в словаре\n",
    "\n",
    "        Результат\n",
    "        ---------\n",
    "        index : int\n",
    "          Индекс токена в словаре\n",
    "        \"\"\"\n",
    "\n",
    "        assert token in self.token_to_idx, f\"Символ {token} отсутствует в словаре\"\n",
    "        return self.token_to_idx[token]\n",
    "\n",
    "    def lookup_index(self, index):\n",
    "        \"\"\" Поиск словая по индексу в словаре \n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        index : int\n",
    "          Индекс для поиска в словаре\n",
    "\n",
    "        Результат\n",
    "        ---------\n",
    "        token : str\n",
    "          Токен для заданного индекса\n",
    "        \"\"\"\n",
    "        assert index in self.idx_to_token, f\"Индекс {index} отсутствует в словаре\"\n",
    "        return self.idx_to_token[index]\n",
    "\n",
    "    def to_serializable(self):\n",
    "        \"\"\" Формирование словаря с сериализованными параметрами объекта класса \"\"\"\n",
    "        return {'token_to_idx': self._token_to_idx}\n",
    "\n",
    "    @classmethod\n",
    "    def from_serializable(cls, contents):\n",
    "        \"\"\" Объект класса  Vocabulary из сериализованного словаря\"\"\"\n",
    "        return cls(**contents)\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self.token_to_idx)\n",
    "\n",
    "    def __str__(self):\n",
    "        return f\"<Vocabulary(len={len(self)})>\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NPnoJltRl3SR"
   },
   "source": [
    "### 2.2 Вспомогательный класс SequenceVocabulary\n",
    "\n",
    "Данный класс наследуется от Vocabulary и предназначается для кодирования текстовых последовательностей. \n",
    "В частности, класс при инициализации добавляет в базу метки для начала и окончания последовательности, метки для незнакомых слов и маски."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "hoDqGLYol2t-"
   },
   "outputs": [],
   "source": [
    "class SequenceVocabulary(Vocabulary):\n",
    "    \"\"\" Класс для кодирования текстовых последовательностей\n",
    "\n",
    "    Параметры\n",
    "    ---------\n",
    "    token_to_idx : dict\n",
    "      Словарь в формате {токен: индекс токена}\n",
    "      По умолчанию None, будет создан чистый словарь.\n",
    "    unk_token : str\n",
    "      Токен для незнакомых слов. По умолчанию <UNK>\n",
    "    mask_token : str\n",
    "      Токен для маски. По умолчанию <MASK>\n",
    "    begin_seq_token : str\n",
    "      Токен для начала последовательности. По умолчанию <BEGIN>\n",
    "    unk_token : str\n",
    "      Токен для окончания последовательности. По умолчанию <END>    \n",
    "    \"\"\"\n",
    "    def __init__(self, token_to_idx=None, unk_token=\"<UNK>\", mask_token=\"<MASK>\", \n",
    "                 begin_seq_token=\"<BEGIN>\", end_seq_token=\"<END>\"):\n",
    "        \n",
    "        super().__init__(token_to_idx=token_to_idx)\n",
    "\n",
    "        self._unk_token = unk_token\n",
    "        self._mask_token = mask_token\n",
    "        self._begin_seq_token = begin_seq_token\n",
    "        self._end_seq_token = end_seq_token\n",
    "\n",
    "        self.unk_index = self.add_token(unk_token)\n",
    "        self.mask_index = self.add_token(mask_token)\n",
    "        self.begin_seq_index = self.add_token(begin_seq_token)\n",
    "        self.end_seq_index = self.add_token(end_seq_token)\n",
    "\n",
    "    def lookup_token(self, token):\n",
    "        \"\"\" Поиск словая по индексу в словаре.\n",
    "        Если токен отсутствует в словаре, будет возвращен индекс для unk_token\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        index : int\n",
    "          Индекс для поиска в словаре\n",
    "\n",
    "        Результат\n",
    "        ---------\n",
    "        token : str\n",
    "          Токен для заданного индекса\n",
    "        \"\"\"\n",
    "\n",
    "        if token not in self.token_to_idx:\n",
    "            return self.unk_index\n",
    "\n",
    "        return self.token_to_idx[token]\n",
    "\n",
    "    def to_serializable(self):\n",
    "        contents = super(SequenceVocabulary, self).to_serializable()\n",
    "        contents.update({'unk_token': self._unk_token,\n",
    "                         'mask_token': self._mask_token,\n",
    "                         'begin_seq_token': self._begin_seq_token,\n",
    "                         'end_seq_token': self._end_seq_token})\n",
    "        return contents"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "qGA7OLZATVhy"
   },
   "source": [
    "### 2.3 Вспомогательный класс SurnameVectorizer\n",
    "\n",
    "Класс отвечает за представление фамилий в вектора, которые будут использоваться для модели.\n",
    "\n",
    "Класс имеет метод vectorize, который возвращает вектор наблюдения (from_vector) и целевой вектор (to_vector). Вектор наблюдения - фамилия человека без последнего символа. А целевой вектор - фамилия человека без первого символа. С помощью данного смещения мы решаем задачу предсказания следующей буквы на каждом временном шаге модели.\n",
    "\n",
    "Каждая буква фамилии переводится в числовой формат с помощью класса SequenceVocabulary. При этом в начало и в конец вектора фамилии вставляются коды начала и окончания последовательности соответственно. Символ начала последовательности нам потребуется в будущем для того, чтобы запустить случайную генерацию фамилии. А по символу окончания последовательности мы даем модели понять, когда заканчивается слово. И в будущем мы можем останавливать цикл генерации фамилии, если модель отдаст символ окончания последовательности во время генерации.\n",
    "\n",
    "Так же метод vectorize принимает в виде параметра размер длины вектора результирующего вектора. Фамилии могут иметь разную длину. Чтобы упаковать все фамилии в один тензор необходимо, чтобы каждый вектор был одинаковой длины. Поэтому необходимо найти в датасете размер самой длинной фамилии и создавать векторы для всех фамилий с постоянной максимальной длиной. Для реализаации этой идеи в случае более короткой фамилии требуется заполнение ее вектора символом маскирования.\n",
    "\n",
    "Предположим, что у нас самая длинная фамилия имеет длину 14. Так как к фамилии добавляются символы начала и длины последовательности, то длина вектора увеличивается до 16. Предположим, что необходимо сделать вектор для фамилии из 5 букв. \n",
    "\n",
    "**Тогда исходный вектор фамилии будет выглядеть следующим образом:**\n",
    "\n",
    "BEGIN_SEQ + 5 символов фамилии + END_SEQ  \n",
    "\n",
    "**Из данного вектора формируем вектор наблюдения следующим образом:**\n",
    "\n",
    "BEGIN_SEQ + 5 символов фамилии + 9 * MASK  \n",
    "\n",
    "**А вектор цели формируем следующим образом:**\n",
    "\n",
    "5 символов фамилии + END_SEQ + 9 * MASK\n",
    "\n",
    "Итоговые длины векторов получились размером 15, а не 16. Так как из каждого вектора убирается один символ."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "f4SsKYs3TU6K"
   },
   "outputs": [],
   "source": [
    "class SurnameVectorizer:\n",
    "    \"\"\" Векторизатор для приведения в соответствие и использования \n",
    "    словарей фамилий и национальностей\n",
    "\n",
    "    Параметры\n",
    "    ---------\n",
    "    char_vocab : SequenceVocabulary\n",
    "      Словарь для символов фамилий\n",
    "    nationality_vocab : SequenceVocabulary\n",
    "      Словарь для национальностей\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, char_vocab, nationality_vocab):\n",
    "\n",
    "        self.char_vocab = char_vocab\n",
    "        self.nationality_vocab = nationality_vocab\n",
    "\n",
    "    def vectorize(self, surname, vector_length=-1):\n",
    "        \"\"\" Векторизация фамилии в вектор наблюдения и цели\n",
    "\n",
    "        Выходными данными являются векторизованная фамилия, разделенная на два вектора:\n",
    "        surname[:-1] и surname[1:]\n",
    "        На каждом временном шаге первый вектор - это наблюдение, а второй вектор - цель.\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        surname : str\n",
    "          Фамилия\n",
    "        vector_length : int\n",
    "          Длина выходных векторов. По умолчанию -1, длина будет формироваться\n",
    "          динамически в зависимости от длины фамилии. В параметр необходимо передавать\n",
    "          реальную длину фамилии без учета дополнительных символов. Итоговый размер\n",
    "          вектора будет на 1 больше, так как будут добавлены символы начала и окончания\n",
    "          последовательности.\n",
    "\n",
    "        Результат\n",
    "        ---------\n",
    "        from_vector, to_vector : np.array, np.array\n",
    "          Вектор наблюдения и вектор цели\n",
    "        \"\"\"\n",
    "\n",
    "        indices = [self.char_vocab.begin_seq_index]\n",
    "        indices.extend([self.char_vocab.lookup_token(char) for char in surname])\n",
    "        indices.append(self.char_vocab.end_seq_index)\n",
    "\n",
    "        if vector_length == -1:\n",
    "            vector_length = len(indices) - 1\n",
    "        else: \n",
    "            vector_length += 2\n",
    "\n",
    "        from_vector = np.zeros(vector_length, dtype=np.int64)\n",
    "        from_indices = indices[:-1]\n",
    "        from_vector[:len(from_indices)] = from_indices\n",
    "        from_vector[len(from_indices):] = self.char_vocab.mask_index\n",
    "\n",
    "        to_vector = np.zeros(vector_length, dtype=np.int64)\n",
    "        to_indices = indices[1:]\n",
    "        to_vector[:len(to_indices)] = to_indices\n",
    "        to_vector[len(to_indices):] = self.char_vocab.mask_index\n",
    "\n",
    "        return from_vector, to_vector\n",
    "\n",
    "    @classmethod\n",
    "    def from_dataframe(cls, surnames_df):\n",
    "        \"\"\" Создание векторизатора на основе датафрейма surnames\n",
    "        Датафрейм должен содержать столбцы surname и nationality\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        surnames_df : pandas dataframe\n",
    "          Датафрейм с фамилиями и национальностями\n",
    "        \"\"\"\n",
    "\n",
    "        char_vocab = SequenceVocabulary()\n",
    "        nationality_vocab = Vocabulary()\n",
    "\n",
    "        for _, row in surnames_df.iterrows():\n",
    "            for char in row.surname:\n",
    "                char_vocab.add_token(char)\n",
    "            nationality_vocab.add_token(row.nationality)\n",
    "\n",
    "        return cls(char_vocab=char_vocab, nationality_vocab=nationality_vocab)\n",
    "\n",
    "    @classmethod\n",
    "    def from_serializable(cls, contents):\n",
    "        \"\"\" Создание объекта класса с помощью сериализованных данных\n",
    "        \"\"\"\n",
    "        char_vocab = SequenceVocabulary.from_serializable(contents['char_vocab'])\n",
    "        nat_vocab =  Vocabulary.from_serializable(contents['nationality_vocab'])\n",
    "\n",
    "        return cls(char_vocab=char_vocab, nationality_vocab=nat_vocab)\n",
    "\n",
    "    def to_serializable(self):\n",
    "        \"\"\" Получение сериализованных параметров объекта класса \"\"\"\n",
    "        return {'char_vocab': self.char_vocab.to_serializable(), \n",
    "                'nationality_vocab': self.nationality_vocab.to_serializable()}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QkDjqM2n5TPy"
   },
   "source": [
    "### 2.4 Вспомогательный класс SurnameDataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "id": "Z6TywI4DTIOm"
   },
   "outputs": [],
   "source": [
    "class SurnameDataset(Dataset):\n",
    "    \"\"\" Генерация данных для обучения модели\n",
    "\n",
    "    Датасет находит максимальную длину фамилии в общих данных\n",
    "    и использует ее для генерации данных для модели.\n",
    "\n",
    "    Класс имеет метод set_split, который переключает на лету датасет для\n",
    "    генерации данных в зависимости от типа разделения данных. Для этого\n",
    "    датафрейм с фамилиями должен сожержать столбец split, в котором \n",
    "    находится метка к какому типу разделения принадлежит фамилия.\n",
    "    Может принимать значение train, val или test.\n",
    "\n",
    "    Параметры\n",
    "    ---------\n",
    "    surname_df : pd.DataFrame\n",
    "      Датафрейм с фамилиями. \n",
    "      Должен содержать колонки surname, nationality и split.\n",
    "    vectorizer : SurnameVectorizer\n",
    "      Объект класса векторизатора фамилий\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, surname_df, vectorizer):\n",
    "\n",
    "        assert set(surname_df.columns.values) == set([\"surname\", \"nationality\", \"split\"])\n",
    "        assert set(surname_df.split.values) == set([\"train\", \"val\", \"test\"])\n",
    "\n",
    "        super().__init__()\n",
    "\n",
    "        self._surname_df = surname_df\n",
    "        self._vectorizer = vectorizer\n",
    "        self._max_seq_length = max(map(len, self._surname_df.surname.values))\n",
    "\n",
    "        self._train_dataset = self._surname_df[self._surname_df.split == 'train'].copy()\n",
    "        self._train_size = len(self._train_dataset)\n",
    "        self._val_dataset = self._surname_df[self._surname_df.split == 'val'].copy()\n",
    "        self._val_size = len(self._val_dataset)\n",
    "        self._test_dataset = self._surname_df[self._surname_df.split == 'test'].copy()\n",
    "        self._test_size = len(self._test_dataset)\n",
    "\n",
    "        self._lookup_dict = {\n",
    "            \"train\": (self._train_dataset, self._train_size),\n",
    "            \"val\": (self._val_dataset, self._val_size),\n",
    "            \"test\": (self._test_dataset, self._test_size),\n",
    "        }\n",
    "\n",
    "        self.set_split(mode=\"train\")\n",
    "\n",
    "    def set_split(self, mode=\"train\"):\n",
    "        \"\"\" Изменение датасета выдачи данных в зависимости от типа разделения\n",
    "        \n",
    "        Параметры\n",
    "        ---------\n",
    "        mode : str\n",
    "          Режим. Может принимать значение train, val или test\n",
    "        \"\"\"\n",
    "        mode = str(mode).lower().strip()\n",
    "        assert mode in (\"train\", \"val\", \"test\")\n",
    "\n",
    "        self._target_df, self._target_size = self._lookup_dict[mode]\n",
    "\n",
    "    @classmethod\n",
    "    def load_dataset_and_make_vectorizer(cls, surname_df):\n",
    "        \"\"\" Создание объекта класса на основе датафрейма surnames\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        surname_df : pandas dataframe\n",
    "          Датафрейм с фамилиями и национальностями. Должен содержать\n",
    "          колонки surname и nationality\n",
    "        \"\"\"\n",
    "        return cls(surname_df, SurnameVectorizer.from_dataframe(surname_df))\n",
    "\n",
    "    def get_vectorizer(self):\n",
    "        \"\"\" Вернуть векторизатор \"\"\"\n",
    "        return self._vectorizer\n",
    "\n",
    "    def __len__(self):\n",
    "        return self._target_size\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        \"\"\" Возвращает элемент датасета по индексу\n",
    "        На выдачу влияет режим, выбранный методом set_split.\n",
    "\n",
    "        Результат в виде словаря с ледующем формате:\n",
    "        {\n",
    "            \"x_data\": вектор наблюдения,\n",
    "            \"target\": вектор цели,\n",
    "            \"class_index\": номер национальности,\n",
    "        }\n",
    "        \"\"\"\n",
    "\n",
    "        row = self._target_df.iloc[idx]\n",
    "        from_vector, to_vector = self._vectorizer.vectorize(surname=row.surname, \n",
    "                                                            vector_length=self._max_seq_length)\n",
    "        \n",
    "        nationality_index = self._vectorizer.nationality_vocab.lookup_token(row.nationality)\n",
    "        \n",
    "        result = {\n",
    "            \"x_data\": from_vector,\n",
    "            \"target\": to_vector,\n",
    "            \"class_index\": nationality_index,\n",
    "        }\n",
    "        \n",
    "        return result"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JZ6OhdYNmXeR"
   },
   "source": [
    "### 2.5 Вспомогательный класс SurnameDatamodule\n",
    "\n",
    "Данный класс необходим для обучения модели с помощью PyToch Lighting.\n",
    "Внутри себя использует SurnameDataset и класс DataLoader из PyTorch для генерации батчей."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "6_PmoirXEJ4C"
   },
   "outputs": [],
   "source": [
    "class SurnameDatamodule(LightningDataModule):\n",
    "    \"\"\" Модуль с датасетом SurnameDataset для использования\n",
    "    PyTorch Lighting\n",
    "\n",
    "    Формат всех словарей загрузчиков:\n",
    "        {\n",
    "            'batch_size': INT,\n",
    "            'shuffle': BOOL,\n",
    "            'num_workers': INT,\n",
    "            'pin_memory': BOOL,\n",
    "            'drop_last': BOOL,\n",
    "        }\n",
    "    Использутся параметры DataLoader из Pytorch.\n",
    "\n",
    "    Параметры\n",
    "    ---------\n",
    "    surname_df : pd.DataFrame\n",
    "      Датафрейм с фамилиями. \n",
    "      Должен содержать колонки surname, nationality и split.\n",
    "    train_loader_params : dict\n",
    "      Словарь параметров для загрузчика обучающего датасета.\n",
    "      По умолчанию None, будут заданы стандартные параметры.\n",
    "    val_loader_params : dict\n",
    "      Словарь параметров для загрузчика валидационного датасета.\n",
    "      По умолчанию None, будут заданы стандартные параметры.\n",
    "    test_loader_params : dict\n",
    "      Словарь параметров для загрузчика тестового датасета.\n",
    "      По умолчанию None, будут заданы стандартные параметры.\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, surname_df, train_loader_params=None, \n",
    "                 val_loader_params=None, test_loader_params=None):\n",
    "        \n",
    "        super().__init__()\n",
    "        \n",
    "        assert set(surname_df.columns.values) == set([\"surname\", \"nationality\", \"split\"])\n",
    "        assert set(surname_df.split.values) == set([\"train\", \"val\", \"test\"])\n",
    "\n",
    "        self._surname_df = surname_df\n",
    "\n",
    "        if not train_loader_params:\n",
    "            train_loader_params = {\n",
    "                    'batch_size': 128,\n",
    "                    'shuffle': True,\n",
    "                    'num_workers': 1,\n",
    "                    'pin_memory': False,\n",
    "                    'drop_last': True,\n",
    "              }\n",
    "\n",
    "        if not val_loader_params:\n",
    "            val_loader_params = {\n",
    "                    'batch_size': 128,\n",
    "                    'shuffle': False,\n",
    "                    'num_workers': 1,\n",
    "                    'pin_memory': False,\n",
    "                    'drop_last': False\n",
    "              }\n",
    "\n",
    "        if not test_loader_params:\n",
    "            test_loader_params = {\n",
    "                    'batch_size': 128,\n",
    "                    'shuffle': False,\n",
    "                    'num_workers': 1,\n",
    "                    'pin_memory': False,\n",
    "                    'drop_last': False\n",
    "              }\n",
    "\n",
    "        self._train_loader_params = train_loader_params\n",
    "        self._val_loader_params = val_loader_params\n",
    "        self._test_loader_params = test_loader_params\n",
    "\n",
    "    def get_vectorizer(self, mode='train'):\n",
    "        if mode == \"train\":\n",
    "            return self.train_dataset.get_vectorizer()\n",
    "        elif mode == \"val\":\n",
    "            return self.val_dataset.get_vectorizer()\n",
    "        elif mode == \"test\":\n",
    "            return self.test_dataset.get_vectorizer()\n",
    "        else:\n",
    "            raise Exception(\"Недопустимый параметр mode\")\n",
    "\n",
    "    def setup(self, stage=None):\n",
    "        \"\"\" Настройка датасетов для загрузчиков\n",
    "\n",
    "        Для каждого загрузчика создается отдельная копия SurnameDataset.\n",
    "        У объекта класса SurnameDataset есть метод set_split. Но если для\n",
    "        всех загрузчиков сделать единый объект SurnameDataset и переключать тип\n",
    "        выдачи на лету в методах train_dataloader и других, то объект класса LightningDataModule в этом случае работает\n",
    "        неверно. На данный момент такое решение является выходом из этой ситуации.\n",
    "        \"\"\"\n",
    "\n",
    "        self.train_dataset = SurnameDataset.load_dataset_and_make_vectorizer(surname_df=self._surname_df.copy())\n",
    "        self.train_dataset.set_split(\"train\")\n",
    "\n",
    "        self.val_dataset = SurnameDataset.load_dataset_and_make_vectorizer(surname_df=self._surname_df.copy())\n",
    "        self.val_dataset.set_split(\"val\")\n",
    "        \n",
    "        self.test_dataset = SurnameDataset.load_dataset_and_make_vectorizer(surname_df=self._surname_df.copy())\n",
    "        self.test_dataset.set_split(\"test\")\n",
    "\n",
    "    def train_dataloader(self):\n",
    "        return DataLoader(self.train_dataset, **self._train_loader_params)\n",
    "\n",
    "    def val_dataloader(self):\n",
    "        return DataLoader(self.val_dataset, **self._val_loader_params)\n",
    "\n",
    "    def test_dataloader(self):\n",
    "        return DataLoader(self.test_dataset, **self._test_loader_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4ZXNnzBDpLNo"
   },
   "source": [
    "### 2.6 Класс генерирующей модели SurnameGenerationModel\n",
    "\n",
    "Данный класс используется для обучения генерирующей модели. Во время обучения модели класс будет выводить графики фунции потерь Cross-Entropy и дополнительной метрики Accuracy в конце каждой эпохи.\n",
    "\n",
    "Так же с помощью метода make_surnames можно запустить демонстрационную генерацию случайных фамилий для каждой национальности.\n",
    "\n",
    "#### Принципы построения модели\n",
    "\n",
    "**1. Использование эмбеддинга национальности в качестве начального скрытого вектора**\n",
    "\n",
    "Данной техникой можно задать для каждой национальности постоянное смещение. Таким образом модель может отличать одну национальность от другой и использовать эти знания как при обучении, так и при генерации данных.\n",
    "\n",
    "**2. К каждому временному шагу присоединияем полносвязанный слой**\n",
    "\n",
    "Это необходимо для предсказания символа на каждом временном шаге. Размер выхода полносвязанной сети равен размеру словаря символов. А вход - размеру выходных скрытых векторов на каждом временном шаге.\n",
    "\n",
    "**3. Не штрафуем модель в функции ошибок за предсказания в позициях символов маски**\n",
    "\n",
    "Для этого используем параметр ignore_index в функции F.cross_entropy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "VGcjIi_BEehw"
   },
   "outputs": [],
   "source": [
    "class SurnameGenerationModel(LightningModule):\n",
    "    \"\"\" Модель для генерации последовательности фамилий\n",
    "\n",
    "    Параметры\n",
    "    ---------\n",
    "    char_embedding_size : int\n",
    "      Размер вектора эмбеддингов для символов фамилий.\n",
    "    char_vocab_size : int\n",
    "      Размер словаря символов фамилий.\n",
    "    padding_idx : int\n",
    "      Номер индекса символа неизвестных значений из словаря символов фамилий.\n",
    "    mask_index : int\n",
    "      Номер индекса символа маски\n",
    "    num_nationalities : int\n",
    "      Количество национальностей\n",
    "    rnn_hidden_size : int\n",
    "      Размер выходного скрытого вектора на каждом шаге\n",
    "    rnn_num_layers : int\n",
    "      Количество слоев RNN. По умолчанию 1.\n",
    "    dropout_p : float\n",
    "      Вероятность дропаута для полносвязанного слоя. По умолчанию 0.5\n",
    "    learning_rate : float\n",
    "      Скорость обучения\n",
    "    l2_regularization : float\n",
    "      Размер L2-регуляризации\n",
    "    adam_betas : (float, float)\n",
    "      b1 и b2 для оптимизатора AdamW.\n",
    "    plot_epoch_loss : bool\n",
    "      Напечатать ли график потерь в конце эпохи обучения. По умолчанию True\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, char_embedding_size, char_vocab_size, padding_idx, mask_index,\n",
    "                 num_nationalities, rnn_hidden_size, rnn_num_layers=1, dropout_p=0.5,\n",
    "                 learning_rate=0.01, l2_regularization=1e-3, \n",
    "                 adam_betas=(0.9, 0.999), plot_epoch_loss=True):\n",
    "        \n",
    "        \n",
    "        super().__init__()\n",
    "        \n",
    "        self.char_emb = nn.Embedding(num_embeddings=char_vocab_size,\n",
    "                                     embedding_dim=char_embedding_size,\n",
    "                                     padding_idx=padding_idx)\n",
    "        \n",
    "        self.nation_emb = nn.Embedding(num_embeddings=num_nationalities,\n",
    "                                            embedding_dim=rnn_hidden_size)\n",
    "        \n",
    "        self.rnn = nn.GRU(input_size=char_embedding_size,\n",
    "                          hidden_size=rnn_hidden_size,\n",
    "                          num_layers=rnn_num_layers,\n",
    "                          batch_first=True)\n",
    "        \n",
    "        self.fc = nn.Linear(in_features=rnn_hidden_size, \n",
    "                            out_features=char_vocab_size)\n",
    "        \n",
    "        self.dropout_p = dropout_p\n",
    "\n",
    "        self.learning_rate = learning_rate\n",
    "        self.adam_betas = adam_betas\n",
    "        self.l2_regularization = l2_regularization\n",
    "        self.plot_epoch_loss = plot_epoch_loss\n",
    "        self.mask_index = mask_index\n",
    "        self.rnn_num_layers = rnn_num_layers\n",
    "\n",
    "        # Словарь для хранения значения ошибок на стадии обучения и валидации\n",
    "        # Для значений типа train добавляем значение np.nan, так как при первом запуске модель вначале осуществляет\n",
    "        # шаг валидации без обучения и добавляет значения в списки типа val. Это будет считаться эпохой №0.\n",
    "        self.train_history = {\n",
    "            'train_loss': [np.nan],\n",
    "            'train_acc': [np.nan],\n",
    "            'val_loss': [],\n",
    "            'val_acc': [],\n",
    "            'test_loss': [],\n",
    "            'test_acc': [],\n",
    "        }\n",
    "        self.plot_epoch_loss = plot_epoch_loss\n",
    "\n",
    "        self.save_hyperparameters()\n",
    "\n",
    "    def forward(self, x_in, nationality_index, apply_softmax=False):\n",
    "\n",
    "        x_embedded = self.char_emb(x_in)\n",
    "        nation_embedded = self.nation_emb(nationality_index).unsqueeze(0)\n",
    "        if self.rnn_num_layers > 1:\n",
    "            nation_embedded = torch.vstack([nation_embedded]*self.rnn_num_layers)\n",
    "        y_out, _ = self.rnn(x_embedded, nation_embedded)\n",
    "        batch_size, seq_size, feet_size = y_out.shape\n",
    "        y_out = y_out.contiguous().view(batch_size*seq_size, feet_size)\n",
    "        y_out = self.fc(F.dropout(y_out, self.dropout_p))\n",
    "\n",
    "        if apply_softmax:\n",
    "            y_out = F.softmax(y_out, dim=1)\n",
    "\n",
    "        new_feet_size = y_out.shape[-1]\n",
    "        y_out = y_out.view(batch_size, seq_size, new_feet_size)\n",
    "\n",
    "        return y_out\n",
    "\n",
    "    @staticmethod\n",
    "    def _normalize_sizes(y_pred, y_true):\n",
    "        \"\"\" Нормализация размеров тензоров\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        y_pred : torch.Tensor\n",
    "          Выходные данные модели. Если тензор трехмерный, то преобразуем его\n",
    "          в матрицу\n",
    "        y_true : torch.Tensor\n",
    "          Целевые предсказания. Если это матрица, то преобразуем в вектор\n",
    "        \"\"\"\n",
    "\n",
    "        if len(y_pred.size()) == 3:\n",
    "            y_pred = y_pred.view(-1, y_pred.size(2))\n",
    "        if len(y_true.size()) == 2:\n",
    "            y_true = y_true.view(-1)\n",
    "\n",
    "        return y_pred, y_true\n",
    "\n",
    "    def _sequence_loss(self, y_pred, y_true, mask_index):\n",
    "        \"\"\" CrossEntropy с учетом маски\"\"\"\n",
    "        y_pred, y_true = self._normalize_sizes(y_pred, y_true)\n",
    "        return F.cross_entropy(y_pred, y_true, ignore_index=mask_index)\n",
    "\n",
    "    def _compute_accuracy(self, y_pred, y_true, mask_index):\n",
    "        \"\"\"Расчет accuracy\"\"\"\n",
    "        y_pred, y_true = self._normalize_sizes(y_pred, y_true)\n",
    "\n",
    "        _, y_pred_indices = y_pred.max(dim=1)\n",
    "        \n",
    "        correct_indices = torch.eq(y_pred_indices, y_true).float()\n",
    "        valid_indices = torch.ne(y_true, mask_index).float()\n",
    "        \n",
    "        n_correct = (correct_indices * valid_indices).sum().item()\n",
    "        n_valid = valid_indices.sum().item()\n",
    "\n",
    "        return n_correct / n_valid * 100\n",
    "\n",
    "    def _share_step(self, batch, batch_idx, mode='train'):\n",
    "        \"\"\" Общий шаг для обучения, валидации и теста\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        batch : dict\n",
    "          Батч-словарь в следующем формате:\n",
    "          {\n",
    "          'x_data': список векторов-наблюдений,\n",
    "          'target': список векторов-целей,\n",
    "          'class_index': код национальности,\n",
    "          }\n",
    "        batch_idx : int\n",
    "          Номер батча\n",
    "        mode : str\n",
    "          Режим. Используется только для префикса названий ошибок в логе.\n",
    "          По умолчанию train\n",
    "        \"\"\"\n",
    "\n",
    "        y_pred = self(x_in=batch[\"x_data\"], nationality_index=batch[\"class_index\"], \n",
    "                      apply_softmax=False)\n",
    "        \n",
    "        loss = self._sequence_loss(y_pred=y_pred, y_true=batch[\"target\"], \n",
    "                                   mask_index=self.mask_index)\n",
    "        \n",
    "        self.log(f'{mode}_loss', loss, prog_bar=True)\n",
    "\n",
    "        accuracy = self._compute_accuracy(y_pred=y_pred, y_true=batch[\"target\"], \n",
    "                                          mask_index=self.mask_index)\n",
    "        self.log(f'{mode}_acc', accuracy, prog_bar=True)\n",
    "\n",
    "        return {\"loss\": loss, 'accuracy': accuracy}\n",
    "\n",
    "    def training_step(self, batch, batch_idx):\n",
    "        \"\"\"Шаг обучения\"\"\"\n",
    "        return self._share_step(batch, batch_idx, mode='train')\n",
    "\n",
    "    def training_epoch_end(self, outputs):\n",
    "        \"\"\"Действия после окончания каждой эпохи обучения\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        outputs : list\n",
    "          Список словарей. Каждый словарь - результат функции self._share_step для определенного батча на шаге обучения\n",
    "        \"\"\"\n",
    "\n",
    "        # Считаем средние ошибки loss и rmse_loss по эпохе\n",
    "        avg_train_loss = torch.tensor([x['loss'] for x in outputs]).detach().mean()\n",
    "        avg_train_acc = torch.tensor([x['accuracy'] for x in outputs]).detach().mean()\n",
    "\n",
    "        # Добавляем средние ошибки в словарь статистики обучения, используется для построение графиков\n",
    "        self.train_history['train_loss'].append(avg_train_loss.numpy().item())\n",
    "        self.train_history['train_acc'].append(avg_train_acc.numpy().item())\n",
    "\n",
    "        # Если включено отображение графика обучения в конце эпохи, то рисуем графики\n",
    "        if self.plot_epoch_loss:\n",
    "            self.plot_history_loss()\n",
    "\n",
    "    def validation_step(self, batch, batch_idx):\n",
    "        \"\"\" Шаг валидации \"\"\"\n",
    "        return self._share_step(batch, batch_idx, mode='val')\n",
    "\n",
    "    def validation_epoch_end(self, outputs):\n",
    "        \"\"\"Действия после окончания каждой эпохи валидации\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        outputs : list\n",
    "          Список словарей.\n",
    "          Каждый словарь - результат функции self._share_step для определенного батча на шаге валидации\n",
    "        \"\"\"\n",
    "\n",
    "        # Считаем средние ошибки loss и rmse_loss по эпохе\n",
    "        avg_val_loss = torch.tensor([x['loss'] for x in outputs]).detach().mean()\n",
    "        avg_val_acc = torch.tensor([x['accuracy'] for x in outputs]).detach().mean()\n",
    "        # Логируем ошибку валидации\n",
    "        self.log(f'val_loss', avg_val_loss, prog_bar=True)\n",
    "\n",
    "        # Добавляем средние ошибки в словарь статистики обучения, используется для построение графиков\n",
    "        self.train_history['val_loss'].append(avg_val_loss.numpy().item())\n",
    "        self.train_history['val_acc'].append(avg_val_acc.numpy().item())\n",
    "\n",
    "        # Если включено отображение графика обучения в конце эпохи, то рисуем графики\n",
    "        if self.plot_epoch_loss:\n",
    "            self.plot_history_loss()\n",
    "\n",
    "    def test_step(self, batch, batch_idx):\n",
    "        \"\"\" Шаг теста \"\"\"\n",
    "        return self._share_step(batch, batch_idx, mode='test')\n",
    "\n",
    "    def configure_optimizers(self):\n",
    "        \"\"\"Конфигурация оптимизатора и планировщика скорости обучения\"\"\"\n",
    "        optimizer = optim.AdamW(self.parameters(), betas=self.adam_betas, lr=self.learning_rate,\n",
    "                                weight_decay=self.l2_regularization)\n",
    "        sheduler = optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer,\n",
    "                                                                  T_0=20,\n",
    "                                                                  eta_min=1e-4)\n",
    "\n",
    "        return [optimizer], [sheduler]\n",
    "\n",
    "\n",
    "    def plot_history_loss(self, clear_output=True):\n",
    "        \"\"\" Функция построения графика обучения в конце эпохи\n",
    "        \"\"\"\n",
    "\n",
    "        fig, axes = plt.subplots(1, 2, figsize=(15, 5))\n",
    "\n",
    "        axes[0].plot(np.arange(0, len(self.train_history['train_loss'])),\n",
    "                     self.train_history['train_loss'],\n",
    "                     label=\"train_loss\")\n",
    "        axes[0].scatter(np.arange(0, len(self.train_history['train_loss'])),\n",
    "                     self.train_history['train_loss'])\n",
    "        axes[0].plot(np.arange(0, len(self.train_history['val_loss'])),\n",
    "                     self.train_history['val_loss'],\n",
    "                     label=\"val_loss\")\n",
    "        axes[0].scatter(np.arange(0, len(self.train_history['val_loss'])),\n",
    "                     self.train_history['val_loss'])\n",
    "        axes[0].legend(loc='best')\n",
    "        axes[0].set_xlabel(\"epochs\")\n",
    "        axes[0].set_ylabel(\"loss\")\n",
    "        val_loss_epoch_min = np.argmin(self.train_history['val_loss'])\n",
    "        val_loss_min = self.train_history['val_loss'][val_loss_epoch_min]\n",
    "        val_loss_min = round(val_loss_min, 3) if not np.isnan(val_loss_min) else val_loss_min\n",
    "        title_min_vals = f'\\nValidation minimum {val_loss_min} on epoch {val_loss_epoch_min}'\n",
    "        axes[0].set_title('MODEL LOSS: Cross-Entropy'+title_min_vals)\n",
    "        axes[0].grid()\n",
    "\n",
    "        axes[1].plot(np.arange(0, len(self.train_history['train_acc'])),\n",
    "        self.train_history['train_acc'], label=\"train_acc\")\n",
    "        axes[1].scatter(np.arange(0, len(self.train_history['train_acc'])),\n",
    "                        self.train_history['train_acc'])\n",
    "        axes[1].plot(np.arange(0, len(self.train_history['val_acc'])),\n",
    "                        self.train_history['val_acc'], label=\"val_acc\")\n",
    "        axes[1].scatter(np.arange(0, len(self.train_history['val_acc'])),\n",
    "                        self.train_history['val_acc'])\n",
    "        axes[1].legend(loc='best')\n",
    "        axes[1].set_xlabel(\"epochs\")\n",
    "        axes[1].set_ylabel(\"accuracy\")\n",
    "        acc_loss_epoch_max = np.argmax(self.train_history['val_acc'])\n",
    "        acc_loss_max = self.train_history['val_acc'][acc_loss_epoch_max]\n",
    "        acc_loss_max = round(acc_loss_max, 3) if not np.isnan(acc_loss_max) else acc_loss_max\n",
    "        title_min_vals = f'\\nValidation maximum {acc_loss_max} on epoch {acc_loss_epoch_max}'\n",
    "        axes[1].set_title('MONITORING LOSS: Accuracy'+title_min_vals)\n",
    "        axes[1].grid()\n",
    "\n",
    "        plt.show()\n",
    "        if clear_output:\n",
    "            display.clear_output(wait=True)\n",
    "\n",
    "    def _sample_from_model(self, vectorizer, nationalities, sample_size=20, \n",
    "                      temperature=1.0):\n",
    "        \"\"\"Sample a sequence of indices from the model\n",
    "        \n",
    "        Параметры\n",
    "        ---------\n",
    "        vectorizer : SurnameVectorizer\n",
    "            Векторизатор фамилий\n",
    "        nationalities : list\n",
    "          Список индексов фамилий для генерации сэмпла\n",
    "        sample_size : int\n",
    "          Размер сэмпла\n",
    "        temperature : float\n",
    "          Подчеркивает или сворачивает распределение\n",
    "          При 0.0 < temperature < 1.0  максимумы заостряются\n",
    "          При temperature > 1.0 делает распределение более равномерным.\n",
    "\n",
    "        Результат\n",
    "        ---------\n",
    "        indices : torch.Tensor: \n",
    "          Матрица индексов символов размером (num_samples, sample_size)\n",
    "        \"\"\"\n",
    "\n",
    "        num_samples = len(nationalities)\n",
    "        begin_seq_index = [vectorizer.char_vocab.begin_seq_index \n",
    "                        for _ in range(num_samples)]\n",
    "        begin_seq_index = torch.tensor(begin_seq_index, \n",
    "                                    dtype=torch.int64).unsqueeze(dim=1)\n",
    "        indices = [begin_seq_index]\n",
    "        nationality_indices = torch.tensor(nationalities, dtype=torch.int64).unsqueeze(dim=0)\n",
    "        h_t = self.nation_emb(nationality_indices)\n",
    "        if self.rnn_num_layers > 1:\n",
    "            h_t = torch.vstack([h_t]*self.rnn_num_layers)\n",
    "        for time_step in range(sample_size):\n",
    "            x_t = indices[time_step]\n",
    "            x_emb_t = self.char_emb(x_t)\n",
    "            rnn_out_t, h_t = self.rnn(x_emb_t, h_t)\n",
    "            prediction_vector = self.fc(rnn_out_t.squeeze(dim=1))\n",
    "            probability_vector = F.softmax(prediction_vector / temperature, dim=1)\n",
    "            indices.append(torch.multinomial(probability_vector, num_samples=1))\n",
    "        indices = torch.stack(indices).squeeze().permute(1, 0)\n",
    "        return indices\n",
    "\n",
    "    @staticmethod\n",
    "    def _decode_samples(sampled_indices, vectorizer):\n",
    "        \"\"\"Декодирование сгенерированных сэмлов модели в символьные значения\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        sampled_indices : torch.Tensor\n",
    "          Индексы из метода _sample_from_model\n",
    "        vectorizer : SurnameVectorizer\n",
    "          Векторизатор фамилий\n",
    "        \n",
    "        Результат\n",
    "        ---------\n",
    "        decoded_surnames : list\n",
    "          Список декодирвоанных фамилий\n",
    "        \"\"\"\n",
    "        decoded_surnames = []\n",
    "        vocab = vectorizer.char_vocab\n",
    "        \n",
    "        for sample_index in range(sampled_indices.shape[0]):\n",
    "            surname = \"\"\n",
    "            for time_step in range(sampled_indices.shape[1]):\n",
    "                sample_item = sampled_indices[sample_index, time_step].item()\n",
    "                if sample_item == vocab.begin_seq_index:\n",
    "                    continue\n",
    "                elif sample_item == vocab.end_seq_index:\n",
    "                    break\n",
    "                else:\n",
    "                    surname += vocab.lookup_index(sample_item)\n",
    "            decoded_surnames.append(surname)\n",
    "\n",
    "        return decoded_surnames\n",
    "\n",
    "    def make_surnames(self, vectorizer, sample_size=5, temperature=1.0):\n",
    "        \"\"\" Запуск генерации случайных фамилий\n",
    "\n",
    "        Параметры\n",
    "        ---------\n",
    "        vectorizer : SurnameVectorizer\n",
    "            Векторизатор фамилий\n",
    "        sample_size : int\n",
    "          Размер сэмпла. По умолчанию 5.\n",
    "        temperature : float\n",
    "          Подчеркивает или сворачивает распределение\n",
    "          При 0.0 < temperature < 1.0  максимумы заостряются\n",
    "          При temperature > 1.0 делает распределение более равномерным.\n",
    "\n",
    "        Результат\n",
    "        ---------\n",
    "        Печать сгенерированных данных на экране\n",
    "        \"\"\"\n",
    "        \n",
    "        for index in range(len(vectorizer.nationality_vocab)):\n",
    "            nationality = vectorizer.nationality_vocab.lookup_index(index)\n",
    "            print(\"{}: \".format(nationality.capitalize()))\n",
    "            sampled_indices = self._sample_from_model(vectorizer=vectorizer,  \n",
    "                                                nationalities=[index] * sample_size, \n",
    "                                                temperature=temperature)\n",
    "            for sampled_surname in self._decode_samples(sampled_indices, vectorizer):\n",
    "                print(\"-  \" + sampled_surname)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HmiJrPJ8xmbY"
   },
   "source": [
    "## 3 Конфигурация и обучение модели"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "id": "KeZJPTE9pCQ2"
   },
   "outputs": [],
   "source": [
    "# Для параметров конфигурации требуется инициализация датасета\n",
    "surname_datamodule = SurnameDatamodule(df_surnames)\n",
    "surname_datamodule.setup()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "id": "IQEJe7RITNMJ"
   },
   "outputs": [],
   "source": [
    "train_config = {'seed': SEED,\n",
    "          'get_optim_params': True,\n",
    "          'model': {\n",
    "              \"char_embedding_size\": 1024, \n",
    "              \"char_vocab_size\": len(surname_datamodule.get_vectorizer().char_vocab), \n",
    "              \"padding_idx\": surname_datamodule.get_vectorizer().char_vocab.mask_index,\n",
    "              \"num_nationalities\": len(surname_datamodule.get_vectorizer().nationality_vocab), \n",
    "              \"rnn_hidden_size\": 1024, \n",
    "              \"rnn_num_layers\": 3,\n",
    "              \"mask_index\": surname_datamodule.get_vectorizer().char_vocab.mask_index,\n",
    "              \"dropout_p\": 0.5,\n",
    "              \"learning_rate\": 0.001, \n",
    "              \"l2_regularization\": 0.01, \n",
    "              \"adam_betas\": (0.9, 0.999), \n",
    "              \"plot_epoch_loss\": True,\n",
    "          },\n",
    "          'dataloader': {\n",
    "              'train_loader_params': {\n",
    "                    'batch_size': 128,\n",
    "                    'shuffle': True,\n",
    "                    'num_workers': 1,\n",
    "                    'pin_memory': False,\n",
    "                    'drop_last': True,\n",
    "              },\n",
    "              'val_loader_params': {\n",
    "                    'batch_size': 128,\n",
    "                    'shuffle': False,\n",
    "                    'num_workers': 1,\n",
    "                    'pin_memory': False,\n",
    "                    'drop_last': False\n",
    "              },\n",
    "              'test_loader_params': {\n",
    "                    'batch_size': 128,\n",
    "                    'shuffle': False,\n",
    "                    'num_workers': 1,\n",
    "                    'pin_memory': False,\n",
    "                    'drop_last': False\n",
    "              }\n",
    "          },\n",
    "         'trainer': {\n",
    "              'max_epochs': 100,\n",
    "              'gpus': 1 if torch.cuda.is_available() else 0,\n",
    "              'progress_bar_refresh_rate': 10,\n",
    "              'resume_from_checkpoint': None,\n",
    "          },\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0in7bh7Vxwjh"
   },
   "source": [
    "Запускаем обучение модели"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 365,
     "referenced_widgets": [
      "6bb52f7b264a41eba1a4a5a071b35c28",
      "22a4a1e32e264156be6c09cb08384813",
      "45ab94420ad74c25bf1111416be0d1d3",
      "40f1410d6d914e31a9385d7748a84ae7",
      "e1c863bc26a04ea683e89cb880d500e8",
      "1e14186d6ed14fbf8e31d60e8dff68ba",
      "3a0757b2b83a4aa297974efffe44064b",
      "a13aab1e12084bdaad0878b229879266",
      "c9ac36bd300a4dd0b845ae1ae1cde6e1",
      "689c1eefbdb64054a4d7d4d6a13cd56d",
      "20055bf89f2948bb93912a6365f3ae14",
      "1ece20d34c4d4ea88efdba74178d92bb",
      "7b708932e25e41b39eeecb9548696db8",
      "f803c4e744d043d7ae3085d030e15e23",
      "692c8a6e1f3d4733a59ac8f68aaa6c54",
      "911f694b274542aba54cdcb33ed09248",
      "c42b91d6cbeb43dc8c017dd5903e4a9a",
      "e09cd381f5624093a714764bbc31673b",
      "441c30bf9f2c40bf9c15206fda79e3b1",
      "f08b1501bfc541e68278e59b76ac123f",
      "18d82227f8094e768238f504b840803f",
      "d3a3bb0003d649c4a8eafef679979102",
      "251274186331417193aff55e7a58b128",
      "b45ccdd285e3444bab591f8186b81952",
      "4b4d6d3417b14956aa81a12f69fe218f",
      "5702a54ea2084d1bb56cd669e0460beb",
      "b93715b6a7264bef997e0aae7b33484a",
      "77dc81d9bdba4160aa1f9ca2c2dfcbea",
      "e995b56ff5bc4fd5a9e9d62af1d22723",
      "43087c913f9e4d4a84bb8c00effb1ded",
      "8b988ee75ae648c9af20e9dca1a50d2d",
      "20082eba58d54332a9de4f8fb23eb69a",
      "2718ae859791450ab49d4926f49562ec",
      "080f110927e74d49abd6adb0b6333b87",
      "9a4c02a853e544668c23183dd77745fd",
      "383f552764d14059bcfc2edf77198e0f",
      "57230ad4594a42c989a457dd48725cff",
      "c9a9496f162646409902ee87dffb9006",
      "7dcbe89e22664c0585c2f8b832b733b7",
      "6763ba1ceb634008b887d0ecc321643f",
      "4cc6a79dd2fe47e5939766066acdaca3",
      "ff3603d762ed4fcf9d6f15457817ed69",
      "89ca1c727cef40b99d0dddb21f4958a8",
      "b2e2d05fd3db4600ac0f7378dd7bb592",
      "3624884593ca4fc5861bee205627ae1c",
      "42612f510e9e42e3b12379d6010d8983",
      "8f88e1a91207426ea3b881dc424413d7",
      "ea3aabb9b5904d54b17502a22cda6af8",
      "1cf803a422bf419bbeb8b15b6f61d466",
      "599b7cc97be544488541be8f9b934841",
      "28fa52d092dc423b97b6860bc25d63e3",
      "c1a86be5c7be4ed9bb111ea28fb9152f",
      "ada1d76eafbf471ba1bdae05306f5c1a",
      "28a786e50dc145faaa844dea6184c58d",
      "7563c3219eb1472db0a118350279b1eb",
      "57bcb04803c34222b832bd5a55a59264",
      "6dc6409e72b74ba08dcf53a397e06426",
      "8831780e20fc4172af43066780271f3d",
      "6010beda3ba44daf95136a044516ccfe",
      "c6c96f8cafb142d28795de83b0797ea6",
      "8ef13d238a6b4c72b343257ffe958ab6",
      "f90dc583482d417f9c9c9a4db880a922",
      "f57426fbaaf241fea63b519bc6ad02d2",
      "966df12cc0cf4daeb6a06d06c28fa1b4",
      "f821822869b54d0c8b2cec270dcc63d4",
      "fcfa9101a0f84da59c4a11c06bd151b6",
      "b5ccecb6426340b28761a9fc89211f9d",
      "6967ae0cbbce480eaa22b1d6d35deda3",
      "71f1ce8194ea4630bbd26af769c5018a",
      "dafa6f83dc89479fb6249160e9f36959",
      "b210ea48294d41d7a07fa32172a8d896",
      "c707639afa454b2fbb3e32569422c362",
      "ed5861b1fb564717a4242aed97c220e1",
      "b8eb0c78598145ee9e96125abbbf18d0",
      "cea478168e614930a1c58ab2e032c085",
      "b25d8cc2b43146cf9943edd39fab8870",
      "89ec7e9219494dd6ab5812d6208b6c93",
      "fb9e7fb3841f4a8eace5ff8011b95586",
      "5dc4271c0eca4a4dbfe125089673e712",
      "0083a82b7d4043d0aa235d9c3d2e7a34",
      "2c9b42c22a3743338d3b069cc7120a14",
      "57419788fa814e80ad0a07e22b0b555b",
      "2988f87b43b442cbabd7d4cdd940a843",
      "8d3378b65d6d49269805a4f60ce108e5",
      "23dbd765e41b46ccba5d24f516dbe78f",
      "4d2f8da8a1bf4ea5bffbb3cf1dbe638a",
      "11cd893a3bd647559be843626d638bb3",
      "7a5b2ef652044673846b95f62434c107",
      "a23081df665346f491c995f4b91d681c",
      "dd9f76155ce04fc2a2f4885505a95827",
      "547bae4a40a94623bb008e3d91e06edc",
      "5a13d75192b34755a85e7b9f74d02ee0",
      "d15d24355dfc4fd18b1a91b75edd0b36",
      "35c72e47e52643b485c9452f82dd7e20",
      "9c6df96b1b2244ef92fd18c9621cf2eb",
      "f0e26bd576044597948c27e194014821",
      "fcde06d0ee3f4f6e9fb787d48c86edc7",
      "3ed338bf7d8d4cdfa314033da5e40a59",
      "cc493acdbd9b4770a5ce9a4159495e38",
      "9f43c837fb804971bd3f8b63b88ce528",
      "93e2a9e769b844b9aefeb35dd6835075",
      "3bff043cb3b5470fa8fe400143ad051d",
      "53591edbca9e41f884d7fcb1e69aa347",
      "825dc12973684e0ca0754f1d9f52d3bd",
      "0060222a069f4671b85b290c51f87608",
      "3cbb754d169840869532902e27ad6142",
      "72f5a803b3cf4fa4b5848710342d860b",
      "0bc7889e6cd9482c8a6ec222ebf266aa",
      "dc48b9c3233f4a9fac71f24de3dc3b27",
      "df62a5686b95459cab2c3efaf5f8a031",
      "f280ee878ca04bf5b25304640e391ccb",
      "e215ea17cede4f028e7c2b22681e0db0",
      "fc2d8434bb144228bda58375dc77d253",
      "426bdcc9b3c945659eedadee4d0bb3b9",
      "da45e96ad77e4fa4a15cb935f19445d1",
      "21353248c9a2445f8ef81f7b2e960376",
      "209e505d090f4e97872e4398e6a45d92",
      "0dea1f6704a349668747bb3644723ba7",
      "aa0997cd1ad34846b25c04a2ee2a7340",
      "bcba96ba1a4745d2b818ba0ae3b428d6",
      "ccfd5a13413b428187224c8931791717",
      "b519f248d8844be99f6709801704761c",
      "2f6e80e9f4c94f4bbcd7a6f8a06bb91c",
      "42aa4c2f0fe64e61a260a8d85e9c7efb",
      "b0200127e9aa4e4ab1f5c657b18e25e9",
      "ae397fa12a364ab9a6f390c3e1556a3e",
      "4c2c4f6f18944e039f4d381e9adca935",
      "ce17399cb5344b0b889c0bf0d6a6697d",
      "8a5cb5f364d74d7b93cfce193ef357a7",
      "6e3837e72418422fb1ca1f233ce653e9",
      "f6dd96e5c89141409ac5ae22089c953b",
      "66406ef9dc0f4d28a356ee1ab1d9ce91",
      "1a41885a18694f6b9e7ef7fc2539f322",
      "af297d23641f4687b6dd348da204b11c",
      "f1cbdfc817de4b8b800faa0bd6f73f48",
      "b65acad77cc840d2b024722e293c142a",
      "b8d36dab3e314449b5e16554007c3300",
      "15b4f4d603cd457ca7c1fae73de0e2cf",
      "3abfd8be396b415e81491a64226eeede",
      "9b26212990fd4edf801c495297b430d8",
      "99c3a2933c6141df9c0b14f76079d2d3",
      "1749ca51ddd845bda14f37a715418c7e",
      "b1604757b248404cb23e21df7b05986b",
      "c734ac1d149346e3b7514a701a83db9a",
      "21af437b925d4a12835941d9a01e5a4d",
      "11e41996b0a445319f32f02ced18a8ed",
      "e94e7ff3b8ac42359ef9e1e184abcc52",
      "12b2289b76ef4082b31020522aba4ec8",
      "81486ba488b6474fa6143caf175c540f",
      "ed3450d95c8d4c8897da08ebd27abb53",
      "3686b7d0a15a4dbeb3b5e1c26d85b8b8",
      "c20610b078b446a0925a41bb33e01be7",
      "287b64fadfec459e98df3f5eb38c8772",
      "90bd40b1e9664cda804cdb49819747c6",
      "29b2ab5d2aa34d6fa6713f3e5f82cba4",
      "4b728f94c8f94242a46f3906d90fa239",
      "a5d8eec75fc2446d987f82f5fef6990d",
      "40af91d346f446188a83f25a13e21444",
      "1b29708ff9a64fed87c691ff301d9376",
      "131ee017d4374b6ca3bd4f8f4897bd82",
      "c13ab1121a4e4d13bac6b7427d392239",
      "e82e54063b2348699ec09d3a5f32d76a",
      "92706d3bf1a4406ea35e1bcdc2c07cc3",
      "af0c1c6973bf4005914d73085d7f1d1c",
      "d9483c4191a84592a57772848d782021"
     ]
    },
    "id": "M8kZQLoMTTCS",
    "outputId": "3c8b040f-1de8-49b0-c0a8-545be1cbc895"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "surname_datamodule = SurnameDatamodule(df_surnames, **train_config[\"dataloader\"])\n",
    "model = SurnameGenerationModel(**train_config[\"model\"])\n",
    "\n",
    "checkpoint = ModelCheckpoint(dirpath='checkpoint/', monitor='val_loss', mode='min')\n",
    "\n",
    "callbacks = [\n",
    "    EarlyStopping('val_loss', min_delta=0.01, patience=3, mode='min'), \n",
    "    checkpoint\n",
    "]\n",
    "\n",
    "trainer = pl.Trainer(callbacks=callbacks, **train_config['trainer'])\n",
    "\n",
    "trainer.fit(model, surname_datamodule)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lXPsa02azT2h"
   },
   "source": [
    "Загрузим лучшую модель из чекпоинта и проверим оценку на тестовой выборке"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 168,
     "referenced_widgets": [
      "8becab3cbce34776a597a3c6359d3414",
      "90979873324c4f5bb08b94769365df6e",
      "9f269cfb6fbf4509a84229d74b541d53",
      "25d6808c2a9a431b837add50cf86b1ea",
      "18dab2d9ee4f42efaf9b7d9d1e22b37b",
      "bd8e42338dbc4075b54f0326bb520e9e",
      "1249be6b028a4fa387f80af31c330ca5",
      "a200b7040cdb4ec88035221da911da79",
      "a333b599e480490f8d510cdfa3e76500",
      "30801716ee8f4794b126fcac9e8c0549",
      "fcaae569661f46968f46bde1c8cd18c6"
     ]
    },
    "id": "2z7RvUChU1Nn",
    "outputId": "eaebb46d-bd73-4b4f-9af3-cf19f90f9337"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Restoring states from the checkpoint path at /content/checkpoint/epoch=12-step=2976-v1.ckpt\n",
      "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]\n",
      "Loaded model weights from checkpoint at /content/checkpoint/epoch=12-step=2976-v1.ckpt\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8becab3cbce34776a597a3c6359d3414",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Testing: 0it [00:00, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--------------------------------------------------------------------------------\n",
      "DATALOADER:0 TEST RESULTS\n",
      "{'test_acc': 49.12651443481445, 'test_loss': 1.6049726009368896}\n",
      "--------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "result = trainer.test(model, surname_datamodule, ckpt_path=\"best\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0vzw8Cp7TEeS"
   },
   "source": [
    "**Сгенерируем для каждой национальности по 5 фамилий**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "kRu0LOX0vfG8",
    "outputId": "bf5b1813-f3b7-4d18-d283-a160cc55d365"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Еврейские: \n",
      "-  бандуровский\n",
      "-  смолиговская\n",
      "-  минцкер\n",
      "-  гельбербаум\n",
      "-  пейсахов\n",
      "Армянские: \n",
      "-  сагателян\n",
      "-  варакян\n",
      "-  парапетян\n",
      "-  кирикоян\n",
      "-  багумян\n",
      "Русские: \n",
      "-  светланин\n",
      "-  усков\n",
      "-  катеринин\n",
      "-  азарьев\n",
      "-  курильчиков\n",
      "Осетинские: \n",
      "-  хъамболтж\n",
      "-  гжбжттотж\n",
      "-  богъатж\n",
      "-  арбиатж\n",
      "-  тонжгатж\n",
      "Японские: \n",
      "-  мотидзуки\n",
      "-  окуяма\n",
      "-  като\n",
      "-  кавагути\n",
      "-  нагаи\n",
      "Английские: \n",
      "-  эпплтон\n",
      "-  барперт\n",
      "-  бард\n",
      "-  берн\n",
      "-  карпентер\n"
     ]
    }
   ],
   "source": [
    "model.make_surnames(vectorizer=surname_datamodule.get_vectorizer(), sample_size=5, temperature=0.7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NGql3w66TL3B"
   },
   "source": [
    "**Выведем примеры реальных фамилий для каждой национальности**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "GuxzHBuksN8M",
    "outputId": "907ffcd5-c2bd-4e2f-85da-cd3465e38662"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Еврейские: \n",
      "-  тулбович\n",
      "-  ямбрус\n",
      "-  натаров\n",
      "-  бруксон\n",
      "-  дворсон\n",
      "Армянские: \n",
      "-  филикян\n",
      "-  агаманян\n",
      "-  есанян\n",
      "-  торчанян\n",
      "-  оганесян\n",
      "Русские: \n",
      "-  рыжикова\n",
      "-  недоспасова\n",
      "-  фильчагина\n",
      "-  тюменцева\n",
      "-  печерина\n",
      "Осетинские: \n",
      "-  атцетж\n",
      "-  къелойтж\n",
      "-  мичелтж\n",
      "-  гасантж\n",
      "-  долотж\n",
      "Японские: \n",
      "-  ямамото\n",
      "-  хасэгава\n",
      "-  мацуи\n",
      "-  кондо\n",
      "-  тагути\n",
      "Английские: \n",
      "-  фокс\n",
      "-  вулф\n",
      "-  парсонс\n",
      "-  фрай\n",
      "-  лав\n"
     ]
    }
   ],
   "source": [
    "for nationality in df_surnames.nationality.unique():\n",
    "    print(\"{}: \".format(nationality.capitalize()))\n",
    "    df = df_surnames[df_surnames.nationality == nationality]\n",
    "    df.index = np.arange(len(df))\n",
    "    indices = np.random.choice(df.index.values, size=5)\n",
    "    sampled_surnames = df.iloc[indices, :][\"surname\"].values\n",
    "    for sampled_surname in sampled_surnames:\n",
    "                print(\"-  \" + sampled_surname)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Nqf1o6w0TR1T"
   },
   "source": [
    "Из результатов видно, что модель достаточно хорошо уловила особенности фамилий каждой национальности не смотря на большой дисбаланс классов.\n",
    "\n",
    "**Как можно улучшить модель:**\n",
    "1. Использовать более современные архитектуры.\n",
    "2. Улучшить качество датасета, убрать дисбаланс количества фамилий у каждой национальности путем добавления новых фамилий."
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": "Last name generator",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "0060222a069f4671b85b290c51f87608": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "0083a82b7d4043d0aa235d9c3d2e7a34": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_8d3378b65d6d49269805a4f60ce108e5",
      "placeholder": "​",
      "style": "IPY_MODEL_2988f87b43b442cbabd7d4cdd940a843",
      "value": "Validating:  98%"
     }
    },
    "080f110927e74d49abd6adb0b6333b87": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_383f552764d14059bcfc2edf77198e0f",
       "IPY_MODEL_57230ad4594a42c989a457dd48725cff",
       "IPY_MODEL_c9a9496f162646409902ee87dffb9006"
      ],
      "layout": "IPY_MODEL_9a4c02a853e544668c23183dd77745fd"
     }
    },
    "0bc7889e6cd9482c8a6ec222ebf266aa": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "0dea1f6704a349668747bb3644723ba7": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "11cd893a3bd647559be843626d638bb3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "11e41996b0a445319f32f02ced18a8ed": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_ed3450d95c8d4c8897da08ebd27abb53",
      "placeholder": "​",
      "style": "IPY_MODEL_81486ba488b6474fa6143caf175c540f",
      "value": "Validating:  98%"
     }
    },
    "1249be6b028a4fa387f80af31c330ca5": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "12b2289b76ef4082b31020522aba4ec8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_90bd40b1e9664cda804cdb49819747c6",
      "placeholder": "​",
      "style": "IPY_MODEL_287b64fadfec459e98df3f5eb38c8772",
      "value": " 40/41 [00:01&lt;00:00, 34.46it/s]"
     }
    },
    "131ee017d4374b6ca3bd4f8f4897bd82": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "15b4f4d603cd457ca7c1fae73de0e2cf": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "1749ca51ddd845bda14f37a715418c7e": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "18d82227f8094e768238f504b840803f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "18dab2d9ee4f42efaf9b7d9d1e22b37b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_fcaae569661f46968f46bde1c8cd18c6",
      "placeholder": "​",
      "style": "IPY_MODEL_30801716ee8f4794b126fcac9e8c0549",
      "value": " 48/48 [00:01&lt;00:00, 33.17it/s]"
     }
    },
    "1a41885a18694f6b9e7ef7fc2539f322": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_f1cbdfc817de4b8b800faa0bd6f73f48",
       "IPY_MODEL_b65acad77cc840d2b024722e293c142a",
       "IPY_MODEL_b8d36dab3e314449b5e16554007c3300"
      ],
      "layout": "IPY_MODEL_af297d23641f4687b6dd348da204b11c"
     }
    },
    "1b29708ff9a64fed87c691ff301d9376": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_d9483c4191a84592a57772848d782021",
      "placeholder": "​",
      "style": "IPY_MODEL_af0c1c6973bf4005914d73085d7f1d1c",
      "value": " 40/41 [00:01&lt;00:00, 34.89it/s]"
     }
    },
    "1cf803a422bf419bbeb8b15b6f61d466": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7563c3219eb1472db0a118350279b1eb",
      "placeholder": "​",
      "style": "IPY_MODEL_28a786e50dc145faaa844dea6184c58d",
      "value": " 40/41 [00:01&lt;00:00, 34.63it/s]"
     }
    },
    "1e14186d6ed14fbf8e31d60e8dff68ba": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "1ece20d34c4d4ea88efdba74178d92bb": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_f803c4e744d043d7ae3085d030e15e23",
       "IPY_MODEL_692c8a6e1f3d4733a59ac8f68aaa6c54",
       "IPY_MODEL_911f694b274542aba54cdcb33ed09248"
      ],
      "layout": "IPY_MODEL_7b708932e25e41b39eeecb9548696db8"
     }
    },
    "20055bf89f2948bb93912a6365f3ae14": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "20082eba58d54332a9de4f8fb23eb69a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "209e505d090f4e97872e4398e6a45d92": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "21353248c9a2445f8ef81f7b2e960376": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "21af437b925d4a12835941d9a01e5a4d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "22a4a1e32e264156be6c09cb08384813": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "23dbd765e41b46ccba5d24f516dbe78f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "251274186331417193aff55e7a58b128": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_4b4d6d3417b14956aa81a12f69fe218f",
       "IPY_MODEL_5702a54ea2084d1bb56cd669e0460beb",
       "IPY_MODEL_b93715b6a7264bef997e0aae7b33484a"
      ],
      "layout": "IPY_MODEL_b45ccdd285e3444bab591f8186b81952"
     }
    },
    "25d6808c2a9a431b837add50cf86b1ea": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_a333b599e480490f8d510cdfa3e76500",
      "max": 1,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_a200b7040cdb4ec88035221da911da79",
      "value": 1
     }
    },
    "2718ae859791450ab49d4926f49562ec": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "287b64fadfec459e98df3f5eb38c8772": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "28a786e50dc145faaa844dea6184c58d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "28fa52d092dc423b97b6860bc25d63e3": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "2988f87b43b442cbabd7d4cdd940a843": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "29b2ab5d2aa34d6fa6713f3e5f82cba4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_a5d8eec75fc2446d987f82f5fef6990d",
       "IPY_MODEL_40af91d346f446188a83f25a13e21444",
       "IPY_MODEL_1b29708ff9a64fed87c691ff301d9376"
      ],
      "layout": "IPY_MODEL_4b728f94c8f94242a46f3906d90fa239"
     }
    },
    "2c9b42c22a3743338d3b069cc7120a14": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_4d2f8da8a1bf4ea5bffbb3cf1dbe638a",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_23dbd765e41b46ccba5d24f516dbe78f",
      "value": 41
     }
    },
    "2f6e80e9f4c94f4bbcd7a6f8a06bb91c": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "30801716ee8f4794b126fcac9e8c0549": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "35c72e47e52643b485c9452f82dd7e20": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "3624884593ca4fc5861bee205627ae1c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_8f88e1a91207426ea3b881dc424413d7",
       "IPY_MODEL_ea3aabb9b5904d54b17502a22cda6af8",
       "IPY_MODEL_1cf803a422bf419bbeb8b15b6f61d466"
      ],
      "layout": "IPY_MODEL_42612f510e9e42e3b12379d6010d8983"
     }
    },
    "3686b7d0a15a4dbeb3b5e1c26d85b8b8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "383f552764d14059bcfc2edf77198e0f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_6763ba1ceb634008b887d0ecc321643f",
      "placeholder": "​",
      "style": "IPY_MODEL_7dcbe89e22664c0585c2f8b832b733b7",
      "value": "Validating:  98%"
     }
    },
    "3a0757b2b83a4aa297974efffe44064b": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "3abfd8be396b415e81491a64226eeede": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "3bff043cb3b5470fa8fe400143ad051d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_3cbb754d169840869532902e27ad6142",
      "placeholder": "​",
      "style": "IPY_MODEL_0060222a069f4671b85b290c51f87608",
      "value": "Validating:  98%"
     }
    },
    "3cbb754d169840869532902e27ad6142": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "3ed338bf7d8d4cdfa314033da5e40a59": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "40af91d346f446188a83f25a13e21444": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_92706d3bf1a4406ea35e1bcdc2c07cc3",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_e82e54063b2348699ec09d3a5f32d76a",
      "value": 41
     }
    },
    "40f1410d6d914e31a9385d7748a84ae7": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "danger",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_c9ac36bd300a4dd0b845ae1ae1cde6e1",
      "max": 2,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_a13aab1e12084bdaad0878b229879266",
      "value": 0
     }
    },
    "42612f510e9e42e3b12379d6010d8983": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "426bdcc9b3c945659eedadee4d0bb3b9": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_aa0997cd1ad34846b25c04a2ee2a7340",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_0dea1f6704a349668747bb3644723ba7",
      "value": 41
     }
    },
    "42aa4c2f0fe64e61a260a8d85e9c7efb": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_ce17399cb5344b0b889c0bf0d6a6697d",
      "placeholder": "​",
      "style": "IPY_MODEL_4c2c4f6f18944e039f4d381e9adca935",
      "value": "Validating:  98%"
     }
    },
    "43087c913f9e4d4a84bb8c00effb1ded": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "441c30bf9f2c40bf9c15206fda79e3b1": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "45ab94420ad74c25bf1111416be0d1d3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_3a0757b2b83a4aa297974efffe44064b",
      "placeholder": "​",
      "style": "IPY_MODEL_1e14186d6ed14fbf8e31d60e8dff68ba",
      "value": "Validation sanity check:   0%"
     }
    },
    "4b4d6d3417b14956aa81a12f69fe218f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e995b56ff5bc4fd5a9e9d62af1d22723",
      "placeholder": "​",
      "style": "IPY_MODEL_77dc81d9bdba4160aa1f9ca2c2dfcbea",
      "value": "Validating:  98%"
     }
    },
    "4b728f94c8f94242a46f3906d90fa239": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "4c2c4f6f18944e039f4d381e9adca935": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "4cc6a79dd2fe47e5939766066acdaca3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "4d2f8da8a1bf4ea5bffbb3cf1dbe638a": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "53591edbca9e41f884d7fcb1e69aa347": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_0bc7889e6cd9482c8a6ec222ebf266aa",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_72f5a803b3cf4fa4b5848710342d860b",
      "value": 41
     }
    },
    "547bae4a40a94623bb008e3d91e06edc": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_9c6df96b1b2244ef92fd18c9621cf2eb",
      "placeholder": "​",
      "style": "IPY_MODEL_35c72e47e52643b485c9452f82dd7e20",
      "value": "Validating:  98%"
     }
    },
    "5702a54ea2084d1bb56cd669e0460beb": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_8b988ee75ae648c9af20e9dca1a50d2d",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_43087c913f9e4d4a84bb8c00effb1ded",
      "value": 41
     }
    },
    "57230ad4594a42c989a457dd48725cff": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_ff3603d762ed4fcf9d6f15457817ed69",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_4cc6a79dd2fe47e5939766066acdaca3",
      "value": 41
     }
    },
    "57419788fa814e80ad0a07e22b0b555b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7a5b2ef652044673846b95f62434c107",
      "placeholder": "​",
      "style": "IPY_MODEL_11cd893a3bd647559be843626d638bb3",
      "value": " 40/41 [00:01&lt;00:00, 34.39it/s]"
     }
    },
    "57bcb04803c34222b832bd5a55a59264": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_8831780e20fc4172af43066780271f3d",
       "IPY_MODEL_6010beda3ba44daf95136a044516ccfe",
       "IPY_MODEL_c6c96f8cafb142d28795de83b0797ea6"
      ],
      "layout": "IPY_MODEL_6dc6409e72b74ba08dcf53a397e06426"
     }
    },
    "599b7cc97be544488541be8f9b934841": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "5a13d75192b34755a85e7b9f74d02ee0": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_fcde06d0ee3f4f6e9fb787d48c86edc7",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_f0e26bd576044597948c27e194014821",
      "value": 41
     }
    },
    "5dc4271c0eca4a4dbfe125089673e712": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "6010beda3ba44daf95136a044516ccfe": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_966df12cc0cf4daeb6a06d06c28fa1b4",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_f57426fbaaf241fea63b519bc6ad02d2",
      "value": 41
     }
    },
    "66406ef9dc0f4d28a356ee1ab1d9ce91": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "6763ba1ceb634008b887d0ecc321643f": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "689c1eefbdb64054a4d7d4d6a13cd56d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "692c8a6e1f3d4733a59ac8f68aaa6c54": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_f08b1501bfc541e68278e59b76ac123f",
      "max": 270,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_441c30bf9f2c40bf9c15206fda79e3b1",
      "value": 270
     }
    },
    "6967ae0cbbce480eaa22b1d6d35deda3": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "6bb52f7b264a41eba1a4a5a071b35c28": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_45ab94420ad74c25bf1111416be0d1d3",
       "IPY_MODEL_40f1410d6d914e31a9385d7748a84ae7",
       "IPY_MODEL_e1c863bc26a04ea683e89cb880d500e8"
      ],
      "layout": "IPY_MODEL_22a4a1e32e264156be6c09cb08384813"
     }
    },
    "6dc6409e72b74ba08dcf53a397e06426": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "6e3837e72418422fb1ca1f233ce653e9": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "71f1ce8194ea4630bbd26af769c5018a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_ed5861b1fb564717a4242aed97c220e1",
      "placeholder": "​",
      "style": "IPY_MODEL_c707639afa454b2fbb3e32569422c362",
      "value": "Validating:  98%"
     }
    },
    "72f5a803b3cf4fa4b5848710342d860b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "7563c3219eb1472db0a118350279b1eb": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "77dc81d9bdba4160aa1f9ca2c2dfcbea": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "7a5b2ef652044673846b95f62434c107": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "7b708932e25e41b39eeecb9548696db8": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "7dcbe89e22664c0585c2f8b832b733b7": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "81486ba488b6474fa6143caf175c540f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "825dc12973684e0ca0754f1d9f52d3bd": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_df62a5686b95459cab2c3efaf5f8a031",
      "placeholder": "​",
      "style": "IPY_MODEL_dc48b9c3233f4a9fac71f24de3dc3b27",
      "value": " 40/41 [00:01&lt;00:00, 35.21it/s]"
     }
    },
    "8831780e20fc4172af43066780271f3d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_f90dc583482d417f9c9c9a4db880a922",
      "placeholder": "​",
      "style": "IPY_MODEL_8ef13d238a6b4c72b343257ffe958ab6",
      "value": "Validating:  98%"
     }
    },
    "89ca1c727cef40b99d0dddb21f4958a8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "89ec7e9219494dd6ab5812d6208b6c93": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8a5cb5f364d74d7b93cfce193ef357a7": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "8b988ee75ae648c9af20e9dca1a50d2d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8becab3cbce34776a597a3c6359d3414": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_9f269cfb6fbf4509a84229d74b541d53",
       "IPY_MODEL_25d6808c2a9a431b837add50cf86b1ea",
       "IPY_MODEL_18dab2d9ee4f42efaf9b7d9d1e22b37b"
      ],
      "layout": "IPY_MODEL_90979873324c4f5bb08b94769365df6e"
     }
    },
    "8d3378b65d6d49269805a4f60ce108e5": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "8ef13d238a6b4c72b343257ffe958ab6": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "8f88e1a91207426ea3b881dc424413d7": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_28fa52d092dc423b97b6860bc25d63e3",
      "placeholder": "​",
      "style": "IPY_MODEL_599b7cc97be544488541be8f9b934841",
      "value": "Validating:  98%"
     }
    },
    "90979873324c4f5bb08b94769365df6e": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "90bd40b1e9664cda804cdb49819747c6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "911f694b274542aba54cdcb33ed09248": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_d3a3bb0003d649c4a8eafef679979102",
      "placeholder": "​",
      "style": "IPY_MODEL_18d82227f8094e768238f504b840803f",
      "value": " 270/270 [00:18&lt;00:00, 14.88it/s, loss=1.24, v_num=17, train_loss=1.230, train_acc=56.90, val_loss=1.620, val_acc=49.20]"
     }
    },
    "92706d3bf1a4406ea35e1bcdc2c07cc3": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "93e2a9e769b844b9aefeb35dd6835075": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "966df12cc0cf4daeb6a06d06c28fa1b4": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "99c3a2933c6141df9c0b14f76079d2d3": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9a4c02a853e544668c23183dd77745fd": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "9b26212990fd4edf801c495297b430d8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "9c6df96b1b2244ef92fd18c9621cf2eb": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "9f269cfb6fbf4509a84229d74b541d53": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_1249be6b028a4fa387f80af31c330ca5",
      "placeholder": "​",
      "style": "IPY_MODEL_bd8e42338dbc4075b54f0326bb520e9e",
      "value": "Testing: 100%"
     }
    },
    "9f43c837fb804971bd3f8b63b88ce528": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_3bff043cb3b5470fa8fe400143ad051d",
       "IPY_MODEL_53591edbca9e41f884d7fcb1e69aa347",
       "IPY_MODEL_825dc12973684e0ca0754f1d9f52d3bd"
      ],
      "layout": "IPY_MODEL_93e2a9e769b844b9aefeb35dd6835075"
     }
    },
    "a13aab1e12084bdaad0878b229879266": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "a200b7040cdb4ec88035221da911da79": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "a23081df665346f491c995f4b91d681c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_547bae4a40a94623bb008e3d91e06edc",
       "IPY_MODEL_5a13d75192b34755a85e7b9f74d02ee0",
       "IPY_MODEL_d15d24355dfc4fd18b1a91b75edd0b36"
      ],
      "layout": "IPY_MODEL_dd9f76155ce04fc2a2f4885505a95827"
     }
    },
    "a333b599e480490f8d510cdfa3e76500": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "a5d8eec75fc2446d987f82f5fef6990d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_c13ab1121a4e4d13bac6b7427d392239",
      "placeholder": "​",
      "style": "IPY_MODEL_131ee017d4374b6ca3bd4f8f4897bd82",
      "value": "Validating:  98%"
     }
    },
    "aa0997cd1ad34846b25c04a2ee2a7340": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ada1d76eafbf471ba1bdae05306f5c1a": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ae397fa12a364ab9a6f390c3e1556a3e": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_66406ef9dc0f4d28a356ee1ab1d9ce91",
      "placeholder": "​",
      "style": "IPY_MODEL_f6dd96e5c89141409ac5ae22089c953b",
      "value": " 40/41 [00:01&lt;00:00, 33.01it/s]"
     }
    },
    "af0c1c6973bf4005914d73085d7f1d1c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "af297d23641f4687b6dd348da204b11c": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "b0200127e9aa4e4ab1f5c657b18e25e9": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_6e3837e72418422fb1ca1f233ce653e9",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_8a5cb5f364d74d7b93cfce193ef357a7",
      "value": 41
     }
    },
    "b1604757b248404cb23e21df7b05986b": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b210ea48294d41d7a07fa32172a8d896": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_89ec7e9219494dd6ab5812d6208b6c93",
      "placeholder": "​",
      "style": "IPY_MODEL_b25d8cc2b43146cf9943edd39fab8870",
      "value": " 40/41 [00:01&lt;00:00, 34.44it/s]"
     }
    },
    "b25d8cc2b43146cf9943edd39fab8870": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "b2e2d05fd3db4600ac0f7378dd7bb592": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b45ccdd285e3444bab591f8186b81952": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "b519f248d8844be99f6709801704761c": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_42aa4c2f0fe64e61a260a8d85e9c7efb",
       "IPY_MODEL_b0200127e9aa4e4ab1f5c657b18e25e9",
       "IPY_MODEL_ae397fa12a364ab9a6f390c3e1556a3e"
      ],
      "layout": "IPY_MODEL_2f6e80e9f4c94f4bbcd7a6f8a06bb91c"
     }
    },
    "b5ccecb6426340b28761a9fc89211f9d": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_71f1ce8194ea4630bbd26af769c5018a",
       "IPY_MODEL_dafa6f83dc89479fb6249160e9f36959",
       "IPY_MODEL_b210ea48294d41d7a07fa32172a8d896"
      ],
      "layout": "IPY_MODEL_6967ae0cbbce480eaa22b1d6d35deda3"
     }
    },
    "b65acad77cc840d2b024722e293c142a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_99c3a2933c6141df9c0b14f76079d2d3",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_9b26212990fd4edf801c495297b430d8",
      "value": 41
     }
    },
    "b8d36dab3e314449b5e16554007c3300": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_b1604757b248404cb23e21df7b05986b",
      "placeholder": "​",
      "style": "IPY_MODEL_1749ca51ddd845bda14f37a715418c7e",
      "value": " 40/41 [00:01&lt;00:00, 34.08it/s]"
     }
    },
    "b8eb0c78598145ee9e96125abbbf18d0": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "b93715b6a7264bef997e0aae7b33484a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_2718ae859791450ab49d4926f49562ec",
      "placeholder": "​",
      "style": "IPY_MODEL_20082eba58d54332a9de4f8fb23eb69a",
      "value": " 40/41 [00:01&lt;00:00, 35.29it/s]"
     }
    },
    "bcba96ba1a4745d2b818ba0ae3b428d6": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "bd8e42338dbc4075b54f0326bb520e9e": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "c13ab1121a4e4d13bac6b7427d392239": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "c1a86be5c7be4ed9bb111ea28fb9152f": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "c20610b078b446a0925a41bb33e01be7": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "c42b91d6cbeb43dc8c017dd5903e4a9a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "c6c96f8cafb142d28795de83b0797ea6": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_fcfa9101a0f84da59c4a11c06bd151b6",
      "placeholder": "​",
      "style": "IPY_MODEL_f821822869b54d0c8b2cec270dcc63d4",
      "value": " 40/41 [00:01&lt;00:00, 34.76it/s]"
     }
    },
    "c707639afa454b2fbb3e32569422c362": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "c734ac1d149346e3b7514a701a83db9a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_11e41996b0a445319f32f02ced18a8ed",
       "IPY_MODEL_e94e7ff3b8ac42359ef9e1e184abcc52",
       "IPY_MODEL_12b2289b76ef4082b31020522aba4ec8"
      ],
      "layout": "IPY_MODEL_21af437b925d4a12835941d9a01e5a4d"
     }
    },
    "c9a9496f162646409902ee87dffb9006": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_b2e2d05fd3db4600ac0f7378dd7bb592",
      "placeholder": "​",
      "style": "IPY_MODEL_89ca1c727cef40b99d0dddb21f4958a8",
      "value": " 40/41 [00:01&lt;00:00, 35.53it/s]"
     }
    },
    "c9ac36bd300a4dd0b845ae1ae1cde6e1": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "cc493acdbd9b4770a5ce9a4159495e38": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ccfd5a13413b428187224c8931791717": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ce17399cb5344b0b889c0bf0d6a6697d": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "cea478168e614930a1c58ab2e032c085": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "d15d24355dfc4fd18b1a91b75edd0b36": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_cc493acdbd9b4770a5ce9a4159495e38",
      "placeholder": "​",
      "style": "IPY_MODEL_3ed338bf7d8d4cdfa314033da5e40a59",
      "value": " 40/41 [00:01&lt;00:00, 34.83it/s]"
     }
    },
    "d3a3bb0003d649c4a8eafef679979102": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "d9483c4191a84592a57772848d782021": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "da45e96ad77e4fa4a15cb935f19445d1": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_ccfd5a13413b428187224c8931791717",
      "placeholder": "​",
      "style": "IPY_MODEL_bcba96ba1a4745d2b818ba0ae3b428d6",
      "value": " 40/41 [00:01&lt;00:00, 34.74it/s]"
     }
    },
    "dafa6f83dc89479fb6249160e9f36959": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_cea478168e614930a1c58ab2e032c085",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_b8eb0c78598145ee9e96125abbbf18d0",
      "value": 41
     }
    },
    "dc48b9c3233f4a9fac71f24de3dc3b27": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "dd9f76155ce04fc2a2f4885505a95827": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "df62a5686b95459cab2c3efaf5f8a031": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e09cd381f5624093a714764bbc31673b": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "e1c863bc26a04ea683e89cb880d500e8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_20055bf89f2948bb93912a6365f3ae14",
      "placeholder": "​",
      "style": "IPY_MODEL_689c1eefbdb64054a4d7d4d6a13cd56d",
      "value": " 0/2 [00:00&lt;?, ?it/s]"
     }
    },
    "e215ea17cede4f028e7c2b22681e0db0": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": "inline-flex",
      "flex": null,
      "flex_flow": "row wrap",
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": "100%"
     }
    },
    "e82e54063b2348699ec09d3a5f32d76a": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "e94e7ff3b8ac42359ef9e1e184abcc52": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_c20610b078b446a0925a41bb33e01be7",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_3686b7d0a15a4dbeb3b5e1c26d85b8b8",
      "value": 41
     }
    },
    "e995b56ff5bc4fd5a9e9d62af1d22723": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ea3aabb9b5904d54b17502a22cda6af8": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_ada1d76eafbf471ba1bdae05306f5c1a",
      "max": 41,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_c1a86be5c7be4ed9bb111ea28fb9152f",
      "value": 41
     }
    },
    "ed3450d95c8d4c8897da08ebd27abb53": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ed5861b1fb564717a4242aed97c220e1": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "f08b1501bfc541e68278e59b76ac123f": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "f0e26bd576044597948c27e194014821": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "f1cbdfc817de4b8b800faa0bd6f73f48": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_3abfd8be396b415e81491a64226eeede",
      "placeholder": "​",
      "style": "IPY_MODEL_15b4f4d603cd457ca7c1fae73de0e2cf",
      "value": "Validating:  98%"
     }
    },
    "f280ee878ca04bf5b25304640e391ccb": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_fc2d8434bb144228bda58375dc77d253",
       "IPY_MODEL_426bdcc9b3c945659eedadee4d0bb3b9",
       "IPY_MODEL_da45e96ad77e4fa4a15cb935f19445d1"
      ],
      "layout": "IPY_MODEL_e215ea17cede4f028e7c2b22681e0db0"
     }
    },
    "f57426fbaaf241fea63b519bc6ad02d2": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "f6dd96e5c89141409ac5ae22089c953b": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "f803c4e744d043d7ae3085d030e15e23": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e09cd381f5624093a714764bbc31673b",
      "placeholder": "​",
      "style": "IPY_MODEL_c42b91d6cbeb43dc8c017dd5903e4a9a",
      "value": "Epoch 12: 100%"
     }
    },
    "f821822869b54d0c8b2cec270dcc63d4": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "f90dc583482d417f9c9c9a4db880a922": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fb9e7fb3841f4a8eace5ff8011b95586": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_0083a82b7d4043d0aa235d9c3d2e7a34",
       "IPY_MODEL_2c9b42c22a3743338d3b069cc7120a14",
       "IPY_MODEL_57419788fa814e80ad0a07e22b0b555b"
      ],
      "layout": "IPY_MODEL_5dc4271c0eca4a4dbfe125089673e712"
     }
    },
    "fc2d8434bb144228bda58375dc77d253": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_209e505d090f4e97872e4398e6a45d92",
      "placeholder": "​",
      "style": "IPY_MODEL_21353248c9a2445f8ef81f7b2e960376",
      "value": "Validating:  98%"
     }
    },
    "fcaae569661f46968f46bde1c8cd18c6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fcde06d0ee3f4f6e9fb787d48c86edc7": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fcfa9101a0f84da59c4a11c06bd151b6": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "ff3603d762ed4fcf9d6f15457817ed69": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": "2",
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
